
import Request from '@/components/luch-request/index.js'
import configs from '@/common/api/config.js'
import api from '@/common/api/webapi.js'
const getTokenStorage = () => {
  let token = ''
  try {
    token = uni.getStorageSync('token')
  } catch (e) {

  }
  return token
}

// 是否正在刷新token
let isRefreshing = false
// 存储需要重发的请求队列
let requests = []

const http = new Request()
http.setConfig((config) => { /* 设置全局配置 */
  config.baseURL = configs.baseUrl /* 根域名不同 */
  config.header = {
    ...config.header,
  }
  return config
})

http.interceptors.request.use((config) => { /* 请求之前拦截器。可以使用async await 做异步操作 */
  config.header = {
    ...config.header,
    "token": getTokenStorage(),
  
  }
  /*
 if (!token) { // 如果token不存在，return Promise.reject(config) 会取消本次请求
   return Promise.reject(config)
 }
 */
  return config
}, (config) => {
  return Promise.reject(config)
})


http.interceptors.response.use(async (response) => { /* 请求之后拦截器。可以使用async await 做异步操作  */
  // if (response.data.code !== 200) { // 服务端返回的状态码不等于200，则reject()
  //   return Promise.reject(response)
  // }
  if(response.data.code === 500){
	    uni.hideLoading();
		uni.showToast({
			icon:'none',
			title: response.data.msg,
			duration: 3000,
			// complete: () => {
			//	uni.hideLoading();
			//	console.log(response)
			//	return;
			// }
		});
		return Promise.reject(response.data);
  }
    // 统一处理token失效情况
    if(response.data.code == '401' || response.data.code == '10001'){
        // 尝试自动刷新token
        const config = response.config;
        if (!isRefreshing) {
            isRefreshing = true;
            // 调用uni.login获取authCode
            return new Promise((resolve, reject) => {
                uni.login({
                    provider: 'weixin',
                    success: (loginRes) => {
                        if (loginRes.code) {
                            // 使用authCode请求后端接口换取新token
                            api.getWxUserInfo({
                                loginChannel: 'WECHAT',
                                authCode: loginRes.code
                            }).then(refreshRes => {
                                if (refreshRes.code === 0) {
                                    // 刷新成功，保存新token
                                    uni.setStorageSync('token', refreshRes.data.token);
                                    // 重置刷新状态
                                    isRefreshing = false;
                                    // 重新发送请求队列
                                    requests.forEach(cb => cb());
                                    requests = [];
                                    // 重新请求当前失败的接口
                                    config.header.token = refreshRes.data.token;
                                    resolve(http.request(config));
                                } else {
                                    // 刷新失败，清除用户登录相关数据并弹出登录框
                                    isRefreshing = false;
                                    // 先保存位置信息
                                    let locationCityName = uni.getStorageSync('temp_locationCityName');
                                    let cityCode = uni.getStorageSync('temp_cityCode');
                                    let longitude = uni.getStorageSync('temp_longitude');
                                    let latitude = uni.getStorageSync('temp_latitude');
                                    
                                    // 清除所有数据
                                    uni.clearStorage();
                                    
                                    // 恢复位置信息
                                    if(locationCityName) uni.setStorageSync('temp_locationCityName', locationCityName);
                                    if(cityCode) uni.setStorageSync('temp_cityCode', cityCode);
                                    if(longitude) uni.setStorageSync('temp_longitude', longitude);
                                    if(latitude) uni.setStorageSync('temp_latitude', latitude);
                                    
                                    // 触发全局登录事件
                                    uni.$emit('tokenExpired');
                                    reject(refreshRes);
                                }
                            }).catch(err => {
                                    isRefreshing = false;
                                    // 先保存位置信息
                                    let locationCityName = uni.getStorageSync('temp_locationCityName');
                                    let cityCode = uni.getStorageSync('temp_cityCode');
                                    let longitude = uni.getStorageSync('temp_longitude');
                                    let latitude = uni.getStorageSync('temp_latitude');
                                    
                                    // 清除所有数据
                                    uni.clearStorage();
                                    
                                    // 恢复位置信息
                                    if(locationCityName) uni.setStorageSync('temp_locationCityName', locationCityName);
                                    if(cityCode) uni.setStorageSync('temp_cityCode', cityCode);
                                    if(longitude) uni.setStorageSync('temp_longitude', longitude);
                                    if(latitude) uni.setStorageSync('temp_latitude', latitude);
                                    
                                    uni.$emit('tokenExpired');
                                    reject(err);
                            });
                        } else {
                            isRefreshing = false;
                            // 先保存位置信息
                            let locationCityName = uni.getStorageSync('temp_locationCityName');
                            let cityCode = uni.getStorageSync('temp_cityCode');
                            let longitude = uni.getStorageSync('temp_longitude');
                            let latitude = uni.getStorageSync('temp_latitude');
                            
                            // 清除所有数据
                            uni.clearStorage();
                            
                            // 恢复位置信息
                            if(locationCityName) uni.setStorageSync('temp_locationCityName', locationCityName);
                            if(cityCode) uni.setStorageSync('temp_cityCode', cityCode);
                            if(longitude) uni.setStorageSync('temp_longitude', longitude);
                            if(latitude) uni.setStorageSync('temp_latitude', latitude);
                            
                            uni.$emit('tokenExpired');
                            reject(new Error('获取authCode失败'));
                        }
                    },
                    fail: (err) => {
                        isRefreshing = false;
                        // 先保存位置信息
                        let locationCityName = uni.getStorageSync('temp_locationCityName');
                        let cityCode = uni.getStorageSync('temp_cityCode');
                        let longitude = uni.getStorageSync('temp_longitude');
                        let latitude = uni.getStorageSync('temp_latitude');
                        
                        // 清除所有数据
                        uni.clearStorage();
                        
                        // 恢复位置信息
                        if(locationCityName) uni.setStorageSync('temp_locationCityName', locationCityName);
                        if(cityCode) uni.setStorageSync('temp_cityCode', cityCode);
                        if(longitude) uni.setStorageSync('temp_longitude', longitude);
                        if(latitude) uni.setStorageSync('temp_latitude', latitude);
                        
                        uni.$emit('tokenExpired');
                        reject(err);
                    }
                });
            });
        } else {
            // 如果正在刷新token，则将当前请求加入队列
            return new Promise((resolve) => {
                requests.push(() => {
                    config.header.token = getTokenStorage();
                    resolve(http.request(config));
                });
            });
        }
    }
  return response.data
}, (response) => { // 请求错误做点什么。可以使用async await 做异步操作
  uni.showToast({
  	icon:'none',
  	title: '服务器维护中'
  });
  return Promise.reject(response)
});

export {
  http,
}
